home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / setjmps.com / SETJMP.ASM < prev    next >
Encoding:
Assembly Source File  |  1991-04-06  |  3.5 KB  |  115 lines

  1. ;  SETJMP.ASM -- asm support routines for turbo pascal setjmp/jmpback
  2. ;                (designed to support overlayed units)
  3. ;  Author: David Stephens,     compuserve 71621,2210
  4. ;  april/91
  5.  
  6. CODE      SEGMENT
  7.           assume    cs:code
  8.  
  9. ;TYPE
  10. ;  jmpBufType = record
  11. ;    localCS : function:word;
  12. ;    ss,sp,bp : word;
  13. ;    ip,cs : word;
  14. ;  end;
  15. ;
  16. ;function setjmp(VAR buf:jmpBufType; localCS:function):integer;
  17. ;procedure jmpback(VAR buf:jmpBufType; ret:integer);
  18. ;
  19. ;   NOTE: (the value of jmpBufType.cs is found by calling the
  20. ;          localCS function when jmpback is called).
  21.  
  22.  
  23.  
  24. BUF       EQU       [BP+10]
  25. FUNC      EQU       [BP+6]
  26. CSx       EQU       [BP+4]
  27. IPx       EQU       [BP+2]
  28.  
  29.           PUBLIC    setjmp,jmpBack
  30.  
  31. setjmp    proc      far
  32. ;calc store "runtime environment:" ss,sp, 'cs',ip, bp.
  33. ;(from the tp documentation, and testing, these appear to be the only
  34. ; registers that need to be preserved).
  35.  
  36.           mov       cx,bp     ;grab the current bp
  37.           push      bp        ;setup stack frame
  38.           mov       bp,sp
  39.           push      ds        ;save pascal data seg
  40.  
  41.           cld
  42.           les       di,BUF    ;set ES:DI = ptr to jmpbufType
  43.           lds       ax,FUNC   ;set DS:AX = address of unit's localCS function
  44.  
  45.           stosw               ;move localCS function adr to jmpbuf
  46.           mov       ax,ds
  47.           stosw
  48.  
  49.           mov       ax,ss     ;move stack adr to jmpbuf
  50.           stosw               ; store SS
  51.           mov       ax,bp     ; calc SP for jmpbuf:
  52.           add       ax,14     ;  (8 bytes params+CSx+IPx+bp = 14 bytes)
  53.           stosw               ; store SP
  54.  
  55.           mov       ax,cx
  56.           stosw               ;store BP to jmpbuf
  57.  
  58.           mov       ax,IPx
  59.           stosw               ;store IP
  60.  
  61.           mov       ax,0      ;function return value = 0
  62.  
  63.           pop       ds
  64.           mov       sp,bp
  65.           pop       bp
  66.           ret       8
  67. setjmp    ENDP
  68.  
  69.  
  70. BUF2      EQU       [BP+8]
  71. retCode   EQU       [BP+6]
  72.  
  73. jmpBack   proc      far
  74.           push      bp
  75.           mov       bp,sp
  76.  
  77.           les       di,BUF2             ;ES:DI = ptr to jmpBuf
  78.           call      dword ptr es:[di]   ;call localCS adr stored in jmpBuf!
  79.                                         ;this faults in ovrly, and returns
  80.                                         ;CS of overlayed unit in AX
  81.           cld
  82.  
  83.           les       di,BUF2             ;ES:DI = ptr jmpBuf again (setup for stosw)
  84.           add       di,12               ;skip to jmpbuf.cs in jmpbuf
  85.           stosw                         ;store the now known CS value
  86.  
  87.           mov       dx,ds               ;keep pascal DS in DX
  88.           mov       cx,retCode          ;keep return code in CX
  89.  
  90.           lds       si,BUF2             ;DS:SI = ptr to jmpbuf (for lodsw)
  91.           add       si,4                ;skip jmpBuf.localCS
  92.  
  93.                                         ;restore stack:
  94.           lodsw                         ;  AX = stackseg
  95.           mov       bx,ax
  96.           lodsw                         ;  AX = stackptr
  97.           mov       ss,bx
  98.           mov       sp,ax               ;  note: cli/sti not needed
  99.  
  100.           lodsw
  101.           mov       bp,ax               ;restore BP
  102.  
  103.           mov       ax,cx               ;set return value
  104.           mov       ds,dx               ;restore pascal DS
  105.  
  106.           jmp       DWORD PTR es:[si]   ;jmp to the now current CS:IP
  107.  
  108. jmpBack   endp
  109.  
  110.  
  111.  
  112. CODE      ENDS
  113.           END
  114.  
  115. ;ignore ambifluous information <smile>.